<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:33
 */
namespace Utility\IO;

/**********************************************************************************************************************
 * /Josn操作json数据和读取json文件
 **********************************************************************************************************************/
class Json
{
    private $_convers_method_arr = ["array", "object"];

    /**
     * isJson
     *
     * @param  $data 需要判断格式的数据
     *
     * 返回bool
     */
    public function isJson($data)
    {
        return is_null(@json_decode($data))?false:true;
    }

    /**
     * getAllConvers
     *
     * @param  $data 需要判断格式的数据
     *
     * 返回数据和对象两种形式的数据，集合在一个数组中
     * ["array"=>, "object"=>]
     *
     */
    public function getAllConvers($data)
    {
        $result_arr = [];
        foreach ($this->_convers_method_arr as $key => $value) {
            $method_name = "mk".$value;
            $result_arr[$value] = $this->$method_name($data);
        }
        return $result_arr;
    }


    /**
     * mkarray
     *
     * @param  $data 需要判断格式的数据
     *
     * 返回转化完成的数组，如果转化失败返回空数组
     *
     */
    public function mkarray($data)
    {
        if ($this->isJson($data)) {
            return $data?json_decode($data, true):json_decode("", true);
        } else {
            return [];
        }
    }

    /**
     * mkobject
     *
     * @param  $data 需要判断格式的数据
     *
     * 返回转化完成的对象，如果转化失败返回空对象
     *
     */
    public function mkobject($data)
    {
        if ($this->isJson($data)) {
            $data_arr = $this->mkarray($data);
            return (object)$data_arr;
        } else {
            $oj = (object)null;
            return $oj;
        }
    }


    /**
     * retJson
     *
     * @param  $data 需要判断格式的数据
     *
     * 返回转化完成的json，如果转化失败返回空json
     *
     */
    public function retJson($data)
    {
        return $data?json_encode($data):json_encode([]);
    }


    /**
     * readFile
     *
     * @param string $file_name 文件路径
     * @param string $ret_type 返回类型 "array", "object"
     *
     * 读取json文件并转化成数组或者对象
     *
     * 注意：默认返回的是数组
     *
     */
    public function readFile($file_name, $ret_type = "array")
    {
        $data = file_get_contents($file_name);
        $ret_arr = $this->getAllConvers($data);
        if ($ret_type) {
            return $ret_arr[$ret_type];
        } else {
            return $ret_arr;
        }
    }


    /**
     * writeFile
     *
     * @param string $ret_type 返回类型 "array", "object"
     *
     * @param  $data 写入的数据
     *
     *
     * 返回写入文件的字符数
     *
     */
    public function writeFile($file_name, $data)
    {

        //用于可以在写入的json文件中换行，人为查看时更清楚一些
        function rep_most($data)
        {
            $could_rep = ["{", "}", ","];
            foreach ($could_rep as $key => $rep) {
                //打开注释开启换行
                //$data = str_replace($rep, $rep.PHP_EOL, $data);
            }
            return $data;
        }
        
        if ($this->isJson($data)) {
            $data = rep_most($data);
            $str_num = file_put_contents($file_name, $data);
        } else {
            $data = $this->retJson($data);
            $data = rep_most($data);
            $str_num = file_put_contents($file_name, $data);
        }
        return $str_num;
    }
}
